import gradio


def get_last_user_after_assistant(history):
    """反向遍历找到最后一个assistant的位置，并返回后面所有的user消息"""
    if not history:
        return None
    if history[-1]['role'] == 'assistant':  # 用户刚刚没有输入消息
        return None

    last_assistant_index = 1
    for i in range(len(history) - 1, -1, -1):
        if history[i]['role'] == 'assistant':
            last_assistant_index = 1
            break
    # 如果没有找到assistant，历史记录全部用户输入的消息，整个返回
    if last_assistant_index == -1:
        return history
    else:
        # 从assistant位置反向查找到第一个user
        return history[last_assistant_index + 1:]


def add_message(history, message):
    """将用户输入添加到聊天记录中"""
    for m in message['files']:
        print(m)
        history.append({'role': 'user', 'content': {'path': m}})
    # 处理文本消息
    if message['text'] is not None:
        history.append({'role': 'user', 'content': message['text']})
    return history, gradio.MultimodalTextbox(value=None, interactive=False)  # 返回更新后的历史和重置输入框


def submit_messages(history):
    """提交用户输入的消息，生成机器人回复"""
    user_message = get_last_user_after_assistant(history)


# 聊天机器人web页面
with gradio.Blocks(title="多模态聊天机器人", theme=gradio.themes.Soft()) as block:
    # 聊天历史记录的组件,就是页面展示的聊天记录
    chatbot = gradio.Chatbot(type='messages', height=500, label='聊天机器人', bubble_full_width=False)

    # 创建多模态输入框
    chat_input = gradio.MultimodalTextbox(
        interactive=True,  # 可交互
        file_types=['image', 'mav', '.mp4'],
        file_count='multiple',  # 允许多文件上传
        placeholder='请输入信息或者上传文件。。。',  # 输入框提示文本
        show_label=False,  # 不显示标签
        sources=['microphone', 'upload']  # 允许麦克风和文件上传
    )
    chat_input.submit(
        add_message,
        [chatbot, chat_input],
        [chatbot, chat_input]
    ).then(
        submit_messages,
        [chatbot],
        [chatbot]
    )

if __name__ == '__main__':
    block.launch()
